#!/bin/bash
# activemq配置
# author    : guyadong
# date      : 2020/07/27
# 导入标志,确保只会被导入一次
activemq_config_included=true
# 脚本初始化
[ "$common_init_included" != 'true' ] && . ./common_init.sh
activemqcfg_title='activemq配置'

service_online activemq $DEFAULT_AMQ_PORT $activemq_port

function fun_activemq_use_local(){    
    [ $context_activemq_configured -eq 0 ] && [ $context_last_code -ne 3 ] && return 4
    [ $context_activemq_configured -eq 0 ] && [ $context_last_code -eq 3 ] && return 3
    local defaultno=    
    [ "$activemq_use_local" = 1 ] && defaultno='--defaultno'

    dialog  --backtitle "$DEFAULT_BACK_TITLE$context_backtitle_suffix" $DLG_YESNO_LABEL \
            --title "$activemqcfg_title" $DLG_BACK_BTN $defaultno \
            --yesno "是否使用本地 activemq 服务?" 5 30
    local code=$?
    [ $code -lt 2 ] && activemq_use_local=$code
    return $code
}

# 检查连接参数是否有无效值,有则返回-1,无则返回0
# $1 $host
# $2 $port
# $3 $mqtt_port
# $4 $ws_port
# $5 $username
# $6 $password
function _check_activemq_params(){
    [[ ! "$1" =~ ^[A-Za-z0-9_\.]+$ ]] && error_message "主机名(host)无效" && return 255
    [[ ! "$2" =~ ^[0-9]{1,5}$      ]] && error_message "端口号(port)不可为空,必须为数字" && return 255
    [[ ! "$3" =~ ^[0-9]{1,5}$      ]] && error_message "端口号(mqtt_port)不可为空,必须为数字" && return 255
    [[ ! "$4" =~ ^[0-9]{1,5}$      ]] && error_message "端口号(ws_port)不可为空,必须为数字" && return 255
    [[ ! "$5" =~ ^[A-Za-z0-9_\.]+$ ]] && error_message "用户名(username)不可为空,字符范围：字母数字以及下划线和." && return 255
    [[ ! "$6" =~ ^[A-Za-z0-9_\.]+$ ]] && error_message "密码(password)不可为空,字符范围：字母数字以及下划线和." && return 255
    return 0
}

# 输出 activemq 连接参数值
function output_activemq_params(){
    echo activemq_host=$activemq_host
    echo activemq_port=$activemq_port
    echo activemq_mqtt_port=$activemq_mqtt_port
    echo activemq_ws_port=$activemq_ws_port
    echo activemq_username=$activemq_username
    echo activemq_password=$activemq_password
}
# 设置 activemq 连接参数
# 从 activemq_host activemq_port 等指向的变量名中读取连接参数作为默认输入
# 对话框结束时回写到对应的变量
# 如果参数无效则一直循环,如果点返回则跳出循环返回3,否则返回0
function fun_activemq_connect(){
    local host="$activemq_host"
    local port="$activemq_port"
    local mqtt_port="$activemq_mqtt_port"
    local ws_port="$activemq_ws_port"
    local username="$activemq_username"
    local password="$activemq_password"
    while true  ; 
    do 
        # 保存对话框选项的值到$values,如果对话框选项返回,则$values值为'EXIT_$?'
        local values=$(dialog \
            --backtitle "$DEFAULT_BACK_TITLE$context_backtitle_suffix" \
            --title '配置 activemq 连接参数' $DLG_BACK_BTN --nocancel \
            --form "请输入activemq连接的参数:" 15 66 0 \
                "主机名(host)        :"  1 1 "$host" 	    1 24 34 0 \
                "AMQP端口号(port)    :"  2 1 "$port"        2 24 34 0 \
                "MQTT端口号(port)    :"  3 1 "$mqtt_port"   3 24 34 0 \
                "WS端口号(port)      :"  4 1 "$ws_port"     4 24 34 0 \
                "用户名(username)    :"  5 1 "$username"    5 24 34 0 \
                "密码(password)      :"  6 1 "$password"    6 24 34 0 \
                3>&1 1>&2 2>&3 || echo EXIT_$?)
        
        [[ "$values" =~ EXIT_[0-9] ]] && return ${values##*EXIT_}
        host="$(echo      "$values" | sed -n 1p)"
        port="$(echo      "$values" | sed -n 2p)"
        mqtt_port="$(echo "$values" | sed -n 3p)"
        ws_port="$(echo   "$values" | sed -n 4p)"
        username="$(echo  "$values" | sed -n 5p)"
        password="$(echo  "$values" | sed -n 6p)"
        ! _check_activemq_params "$host" "$port" "$mqtt_port" "$ws_port" "$username" "$password" && continue
        # 按确认按钮时将对话框返回值分别保存到对应的变量中
        activemq_host="$host"
        activemq_port="$port"
        activemq_mqtt_port="$mqtt_port"
        activemq_ws_port="$ws_port"
        activemq_username="$username"
        activemq_password="$password"
        context_activemq_configured=0
        return 0
    done
}

function fun_local_activemq_connect(){
    [ -z "$activemq_host" ] && activemq_host=$DEFAULT_AMQ_HOST
    [ $activemq_online -eq 0 ] && activemq_port=$activemq_online_port
    [ $activemq_online -ne 0 ] && [ -z "$activemq_port" ] && activemq_port=$DEFAULT_AMQ_PORT
    [ -z "$activemq_username" ] && activemq_username=$DEFAULT_AMQ_USERNAME
    # 没有指定密码时生成随机密码
    [ -z "$activemq_password" ] && activemq_password="$(date +%s | md5sum | base64 | head -c 8)"
    fun_activemq_connect
}
function fun_remote_activemq_connect(){    
    [ "$activemq_host" == $DEFAULT_AMQ_HOST ] && activemq_host=
    fun_activemq_connect
}

# 返回 activemq 参数组成的 URI
# $1 URI schema
# $2 URI 端口
# $3 true URI 中包含用户信息(username,password),为空则不包含
function make_activemq_port_uri(){
    [ -z "$3" ] && echo "$1://$activemq_host:$2" && return 
    [ -z "$activemq_username" ] && [ -z "$activemq_password" ] echo "$1://$activemq_host:$2" && return 
    [ "${3,,}" = 'true' ] && echo "$1://$activemq_username:$activemq_password@$activemq_host:$2" && return 
    echo "$1://$activemq_host:$2"
}

# 返回 activemq_host activemq_port 参数组成的 URI (amqp://)
# $1 true URI 中包含用户信息(username,password),为空则不包含
function make_activemq_uri(){
    make_activemq_port_uri 'amqp' $activemq_port $1
}
# 返回 activemq_host activemq_mqtt_port 参数组成的 URI (mqtt://)
# $1 true URI 中包含用户信息(username,password),为空则不包含
function make_activemq_mqtt_uri(){
    make_activemq_port_uri 'mqtt' $activemq_mqtt_port $1
}
# 返回 activemq_host activemq_ws_port 参数组成的 URI (ws://)
# $1 true URI 中包含用户信息(username,password),为空则不包含
function make_activemq_ws_uri(){
    make_activemq_port_uri 'ws' $activemq_ws_port $1
}
#fun_activemq_connect
#output_activemq_params
